package com.uade.facade;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import com.uade.model.Compra;
import com.uade.model.Articulo;
import com.uade.model.Configuracion;
import com.uade.model.Evento;
import com.uade.model.Ranking;
import com.uade.model.Usuario;
import com.uade.model.exceptions.BusinessException;
import com.uade.model.exceptions.LoginException;
import com.uade.model.exceptions.LogisticaMonitoreoException;
import com.uade.model.exceptions.MessageException;
import com.uade.model.exceptions.NotFoundException;
import com.uade.sessionBeans.AdministradorCompra;
import com.uade.sessionBeans.AdministradorConfiguracion;
import com.uade.sessionBeans.AdministradorUsuario;
import com.uade.sessionBeans.AdministradorArticulos;

/**
 * Session Bean implementation class Facade
 */
@Stateless
public class FacadeBean implements Facade {

	/**
	 * Default constructor.
	 */
	public FacadeBean() {

	}

	@EJB
	AdministradorArticulos administradorArticulos;
	@EJB
	AdministradorUsuario administradorUsuario;
	@EJB
	AdministradorConfiguracion administradorConfiguracion;
	@EJB
	AdministradorCompra administradorCompra;

	private Logger log = Logger.getLogger(FacadeBean.class);
	
	@Override
	public Usuario loguearse(String nombre, String password)
			throws LoginException {
		return administradorUsuario.loginUsuario(nombre, password);
	}

	@Override
	public void altaUsuario(Usuario usuario) {
		administradorUsuario.altaUsuario(usuario);

	}

	@Override
	public void modificarItemCarrito(Usuario usuario, String accion,
			Articulo articulo) {

	}

	@Override
	public void checkOutCompra(Compra compra) throws BusinessException,
			LogisticaMonitoreoException {

		administradorCompra.confirmarCarrito(compra);

	}

	@Override
	public List<Compra> consultaCompras(int idUsuario) {

		return administradorCompra.getCompras(idUsuario);
	}

	@Override
	public void modificarConfiguracion(Configuracion configuracion) {
		administradorConfiguracion.modificarConfiguracion(configuracion);

	}

	@Override
	public void recepcionBestSellers(List<Articulo> listaProd)
			throws MessageException {

	}

	@Override
	public String recepcionEntrega(String estado, int idCompra) {
		administradorCompra.recepcionEntrega(estado, idCompra);
		log.info("Se persistio la recepcion de entrega");
		
		Evento evento= new Evento();
		evento.setAccion("Recepcion de confirmacion de entrega de la compra");
		evento.setIdCompra(String.valueOf(idCompra));
		try {
			this.enviarLogLogisticaMonitoreoForCompra(evento);
		} catch (Exception e) {
			log.error("No se pudo loguear la recepcion de la entrega a Logistica"
					+ ". Error: " + e.getMessage());
		}
		return "Se persistio la recepcion de entrega";
	}

	@Override
	public void nuevoArticulo(String categoria, String foto, String marca,
			String origen, String descripcion, double precio, String nombre) {

		administradorArticulos.altaProducto(categoria, foto, marca, origen,
				descripcion, precio, nombre);
	}

	@Override
	public Articulo busqueda(int id) throws NotFoundException {
		return administradorArticulos.buscar(id);
	}

	@Override
	public List <Articulo> busqueda(String nombre,String categoria) throws NotFoundException {
		return administradorArticulos.buscar(nombre, categoria);
	}

	@Override
	public List<Articulo> listarArticulos() throws NotFoundException {
		return administradorArticulos.listarProductos();
	}

	@Override
	public List<Articulo> listarArticulosPorRanking() throws NotFoundException {

		return administradorArticulos.listarArticulosByRanking();
	}

	@Override
	public void nuevoArticulo(Articulo articulo) {
		log.info("Alta de Articulo");
		administradorArticulos.altaArticulo(articulo);

	}

	@Override
	public List<Configuracion> obtenerConfiguraciones() {
		return administradorConfiguracion.obtenerListadoConfiguracion();
	}
	

	@Override
	public void actualizarRanking(Ranking ranking) throws NotFoundException {
		administradorArticulos.actualizarRanking(ranking);	
		
	}

	@Override
	public void enviarLogLogisticaMonitoreo(Evento evento) throws BusinessException, LogisticaMonitoreoException {
		administradorCompra.enviarLogLogisticaMonitoreo(evento.getXml());
		
	}
	public void enviarLogLogisticaMonitoreoForCompra(Evento evento) throws BusinessException, LogisticaMonitoreoException {
		administradorCompra.enviarLogLogisticaMonitoreo(evento.getXml());
		
	}

}
